package acadclockmidletpkg;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.*;
import javax.microedition.rms.RecordStore;

/**
 * Отображает текущее время, дату, день недели, а также номер недели 
 * в семестре и её характеристики: числитель/знаменатель, первый/второй.
 *
 * @author Kolomoets G.P.
 * @version 1.0
 */
public class MainMIDlet extends MIDlet implements CommandListener {

    //Объект, инкапсулирующий методы работы с базой данных
    private static RMSWorker worker;
    //Команды
    private Command exitMiidlet;
    private Command openSettingsForm;
    private Command saveSettingsForm;
    //Команда выхода из настроек без сохранения и перехода к главному экрану
    private Command cancelSettingsForm;
     //Команда очистки базы данных
    private Command cleanDBCommand;
    //Экраны
    //Объект-главный экран с данными о дате и времни
    private MainScreen mainScreen;
    //Форма и элементы экрана настроек
    private SettingsScreen settingsForm;
    //Дисплей
    private Display myDisplay;

    /**
     * Конструктор - создание команд и объектов работы с БД и главного экрана.
     */
    public MainMIDlet() {
        this.exitMiidlet = new Command("Выход", Command.EXIT, 0);
        this.openSettingsForm = new Command("Настройки", Command.SCREEN, 0);
        this.saveSettingsForm = new Command("Сохранить", Command.OK, 0);
        this.cancelSettingsForm = new Command("Отмена", Command.BACK, 0);
        this.cleanDBCommand=new Command("Очистить", Command.SCREEN, 0);
        MainMIDlet.worker = new RMSWorker();
        /*Инициализация главного экрана*/
        this.mainScreen = new MainScreen();
        myDisplay = Display.getDisplay(this);
    }

    /**
     * @return the worker
     */
    public static RMSWorker getWorker() {
        return worker;
    }

    public void startApp() {
        mainScreen.addCommand(exitMiidlet);
        mainScreen.addCommand(openSettingsForm);
        mainScreen.setCommandListener(this);
        myDisplay.setCurrent(mainScreen);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    /**
     * Обработчик команд.
     * @param c кодманда
     * @param d объект Displayable (либо главный экран, либо форма настроеек)
     */
    public void commandAction(Command c, Displayable d) {
        if (d == mainScreen) {
            if (c == exitMiidlet) {
                destroyApp(false);
                notifyDestroyed();
            } else if (c == openSettingsForm) {
                buildSettingsForm();
                /*Считывание текщих данных полей для формы настроеек*/
                settingsForm.firstSemesterBegin.setDate(getWorker().readDateRecord(1));
                settingsForm.secondSemesterBegin.setDate(getWorker().readDateRecord(2));
                settingsForm.pairDuration.setString(getWorker().readTextRecord(3));
                settingsForm.firstPairBegin.setDate(getWorker().readDateRecord(4));
                settingsForm.secondPairBegin.setDate(getWorker().readDateRecord(5));
                settingsForm.thirdPairBegin.setDate(getWorker().readDateRecord(6));
                settingsForm.fourthPairBegin.setDate(getWorker().readDateRecord(7));
                settingsForm.fifthPairBegin.setDate(getWorker().readDateRecord(8));
                settingsForm.sixthPairBegin.setDate(getWorker().readDateRecord(9));
                settingsForm.seventhPairBegin.setDate(getWorker().readDateRecord(10));
                settingsForm.eighthPairBegin.setDate(getWorker().readDateRecord(11));
                settingsForm.ninethPairBegin.setDate(getWorker().readDateRecord(12));
                myDisplay.setCurrent(settingsForm);
            }
        } else if (d == settingsForm) {
            if (c == saveSettingsForm) {
                /*Обновление значений полей формы настроеек*/
                getWorker().updateDateRecord(1, settingsForm.firstSemesterBegin);
                getWorker().updateDateRecord(2, settingsForm.secondSemesterBegin);
                getWorker().updateTextRecord(3, settingsForm.pairDuration);
                getWorker().updateDateRecord(4, settingsForm.firstPairBegin);
                getWorker().updateDateRecord(5, settingsForm.secondPairBegin);
                getWorker().updateDateRecord(6, settingsForm.thirdPairBegin);
                getWorker().updateDateRecord(7, settingsForm.fourthPairBegin);
                getWorker().updateDateRecord(8, settingsForm.fifthPairBegin);
                getWorker().updateDateRecord(9, settingsForm.sixthPairBegin);
                getWorker().updateDateRecord(10, settingsForm.seventhPairBegin);
                getWorker().updateDateRecord(11, settingsForm.eighthPairBegin);
                getWorker().updateDateRecord(12, settingsForm.ninethPairBegin);
                myDisplay.setCurrent(mainScreen);
            } else if (c == cancelSettingsForm) {
                myDisplay.setCurrent(mainScreen);
            } else if(c==cleanDBCommand){
                cleanDB();
            }
        }
    }

    /**
     * Построение формы настроек.
     */
    private void buildSettingsForm() {
        this.settingsForm = new SettingsScreen("Настройки");
        settingsForm.addCommand(saveSettingsForm);
        settingsForm.addCommand(cancelSettingsForm);
        settingsForm.addCommand(cleanDBCommand);
        settingsForm.setCommandListener(this);
    }

    /**
     * Удвление хранилища базы данных.
     */
    private void cleanDB() {
        if (RecordStore.listRecordStores() != null) {
            try {
                worker.closeRecordStore();
                RecordStore.deleteRecordStore(worker.nameDB);
                myDisplay.setCurrent(mainScreen);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        myDisplay.setCurrent(mainScreen);
    }
}
